Air Monitoring Data
Data dictionary for the air monitoring data published by Martinez Refining Company: every field in every data set, what it holds and what type it is.
Four data sets are published, for four different purposes:
| Data set | What it is | Manual download | API |
|---|---|---|---|
| Fenceline Monitoring Data | Five-minute average pollutant concentrations, one record per instrument, parameter and averaging period, with detection limits, quality codes and instrument signal. | CSV, XML | CSV, JSON |
| GLM Data | Five-minute average concentrations from the four ground level monitors operated under Air District Rules 9-1 and 9-2. Hydrogen sulfide at all four, sulfur dioxide at Ace Hardware. | CSV, XML | CSV, JSON |
| Monitoring Locations | Where each analyzer, reflector, light source, met station and ground level monitor sits, and what it reports. Fixed positions, so there is no date range. | CSV, GeoJSON, shapefile | CSV, JSON, GeoJSON |
| Current Readings | The single latest reading for every monitoring location and property, as shown on the public dashboard. Includes weather properties. | None | JSON |
Fenceline Monitoring Data
- Manual download: CSV and XML
- API: CSV and JSON
- Averaging period: 5 minutes
- Time zone: Pacific Standard Time, year-round
- Access: Public, with no login or API key required for the API
Data dictionary
Every field below carries the same name in CSV, XML and JSON, and the fields appear in the same order in all three.
Ozone appears on the public dashboard and in Current Readings, and not in this data set. The four beam paths measure it as a quality cross-check against a nearby reference station, not as a fenceline pollutant.
QC_code and error_codes both describe data quality, and
they are not interchangeable. QC_code gives the specific flag number
defined in the Quality Assurance
Project Plan. error_codes gives the broad category that flag falls
into, and many flags fall into none of the categories, so it reads empty on plenty of
flagged readings. Read QC_code when the precise flag matters.
| Field | Type | Description |
|---|---|---|
facility_name | text | The facility where the equipment sits. Always
Martinez Refining Company. |
instrument_id | text | Identifier for the instrument that produced the measurement. One identifier per physical analyzer, shared by every parameter that analyzer measures. |
instrument | text | Short descriptive name for the instrument, pairing its monitoring location with its analyzer type: UV-DOAS, TDL, FTIR or OGD. |
parameter | text | Name of the pollutant measured and reported, for example
Benzene or Total Alkanes. |
date | text, yyyy-mm-dd |
Date of measurement, in Pacific Standard Time with no adjustment for daylight saving. |
time | text, hh:mm |
Start of the five-minute period the measurements cover, in 24-hour notation, in Pacific Standard Time with no adjustment for daylight saving. |
mean_concentration | number | Arithmetic mean pollutant concentration over the averaging period.
Where a reading falls below the limit of quantification the instrument
achieved for it, this field carries half that limit;
real_time_loq carries the limit itself. |
units_of_measure | text | Units for mean_concentration, for example
ppb. |
averaging_period | integer, minutes | Length of the period the mean concentration covers. Always
5. |
observation_count | integer | How many individual instrument readings the reported mean covers. It
differs by analyzer type, because each samples at its own rate across the
five-minute period. A UV-DOAS row reads 1: that analyzer
averages internally and delivers one value per period. An FTIR row gives
the number of interferogram scans co-added into its spectrum. A row reads
empty where its instrument records no count of its own. |
validity_indicator | Y or N |
Whether the reported mean concentration represents a valid air
measurement. N covers a light signal too weak or too strong to
trust, humidity above the instrument's operating range, an instrument fault,
and QA or test mode instead of ambient sampling. Every quality flag the
reading carried decides this, not only the flag published in
QC_code. |
error_codes | text | The broad data quality category assigned to the measurement:
Missing, Invalid, Low Signal,
Weather or QA. Empty for a reading with no quality
issue, and empty as well where the reading's flag falls into none of those
categories, which is common. See QC_code for the underlying
flag. |
max_value | number | Carries the same value as mean_concentration. Each record
describes a single five-minute average, so it holds no separate maximum of
its own. |
required_loq | number | The limit of quantification the Quality Assurance Project Plan requires
for this instrument and pollutant. A fixed target, unlike
real_time_loq. |
real_time_loq | number | The limit of quantification the instrument achieved for this reading, in
the same units as mean_concentration. It is calculated per
reading, so it moves over time. This quantity also goes by real-time minimum
detection limit, or MDL. |
signal | number | Mean measured light signal over the averaging period, or the mean of the alternative parameter the instrument uses to monitor its light signal. |
signal_units | text | Units for signal. These differ by analyzer type, because
each type monitors its signal differently: light count for UV-DOAS,
% full scale for FTIR, %transmission for TDL, and mA for OGD, whose signal
is the analyzer's 4 to 20 mA current loop. |
QC_code | text | The data quality flag assigned to the measurement, given as the flag
number defined in the Quality Assurance Project Plan. Empty for a reading
that carried no flag, and Missing for an averaging period the
instrument never reported.
A single reading can trip more than one quality check. This column gives the governing flag for that reading, and where any flag present invalidates the reading, the governing flag is one of those. validity_indicator weighs every flag on the reading. |
final_data | Y or N |
Whether the record has cleared final quality assurance review.
N marks a preliminary record. Every record published to date
reads N. |
change_log | text | Description of any change made to the record, with the date of the change. Empty for an unchanged record, which so far is all of them. |
Missing measurements
A record with no pollutant concentration still gets published, whether the instrument
recorded the period without producing a concentration or never reported for that period
at all. It keeps facility_name, instrument_id,
instrument, parameter, date, time,
QC_code and error_codes. Every remaining field, the text ones
included, carries -9999. A negative value in any of those fields therefore
means "not available" and never a real measurement.
GLM Data
- Manual download: CSV and XML
- API: CSV and JSON
- Averaging period: 5 minutes
- Time zone: Pacific Standard Time, year-round
- Monitors: Ace GLM, Mt View GLM, Shell Ave GLM, ETP GLM
real_time_loq, signal,
signal_units or QC_code. Every other field means exactly
what it means in the Fenceline Monitoring Data above.
Data dictionary
Sixteen fields, in the same order as their Fenceline Monitoring Data counterparts, so the two files line up column for column where they overlap.
| Field | Type | Description |
|---|---|---|
facility_name | text | Always "Martinez Refining Company". |
instrument_id | text | Identifier for the monitor: glm_ace, glm_mtview, glm_shellave or glm_etp. |
instrument | text | The monitor's name, for example "Ace GLM". |
parameter | text | "Hydrogen Sulfide" or "Sulfur Dioxide". |
date | date | Date of measurement, Pacific Standard Time, yyyy-mm-dd. |
time | time | Start of the five-minute period, Pacific Standard Time, hh:mm. |
mean_concentration | number | Mean concentration over the period, in ppb. |
units_of_measure | text | Always "ppb". |
averaging_period | number | Always 5, in minutes. |
observation_count | number | Values behind the mean. Blank while the monitors do not report a count. |
validity_indicator | text | "Y" or "N". Every reading is currently "Y": the monitors publish no quality flags yet. |
error_codes | text | Reason a reading is invalid or missing. "Missing" on a period the monitor did not report; otherwise blank until the monitors supply error codes. |
max_value | number | Highest value in the period. Equal to mean_concentration while the monitors report one value per period. |
required_loq | number | Required limit of quantification. Blank: no required LoQ is set for the ground level monitors. |
final_data | text | "Y" once a record is final quality-assured data. Currently always "N". |
change_log | text | Description of any change made to the record. Currently always blank. |
Missing measurements
A five-minute period the monitor did not report still produces a record. It keeps
facility_name, instrument_id, instrument,
parameter, date and time, sets
error_codes to "Missing", and sets every other field to
-9999.
Not yet reporting
The data feed for these monitors is still being built. Until it is in place every period returns a "Missing" record as described above, and the dashboard shows a dash rather than a reading.
Monitoring Locations
- Manual download: CSV, GeoJSON and shapefile
- API: CSV, JSON and GeoJSON
- Coordinate system: WGS 84, decimal degrees
- Access: Public, with no login or API key required for the API
Where each monitoring instrument sits, and what it reports. There is no date range;
these are fixed installation positions. Each published point gets one record: a point
instrument, the met station and each ground level monitor have one apiece, and an open
path has two. Both ends of a path share an instrument_id and are told apart
by the instrument name.
The two open path instrument types are built differently, so the far end of a path is
not the same thing in both cases. A TDL sends its beam to a corner cube reflector and
reads the return at the analyzer, so its two points are
Open Path Analyzer and Reflector. A UV-DOAS puts a lamp at one
end and the analyzer at the other, with no reflector on the path at all, so its two
points are Open Path Analyzer and Light Source. The analyzer
end carries that name in both cases.
Data dictionary
| Field | Type | Description |
|---|---|---|
facility_name | Text | The facility where the equipment sits. |
instrument_id | Text | Identifier for the instrument. Both ends of an open path share one, because they are one instrument. |
instrument | Text | Descriptive name for the instrument, including which end of an open path the point is, as described above. |
parameters | Text | The pollutants that instrument reports, comma separated. Empty where an instrument's parameters are not yet confirmed. |
latitude | Number | Decimal degrees, north positive, to six places. |
longitude | Number | Decimal degrees, east positive, to six places. |
In GeoJSON the same six fields appear as each feature's properties, and
the geometry is a Point whose coordinates read
[longitude, latitude]. The GeoJSON specification fixes that order, which
reverses the column order above.
A shapefile's attribute table is dBASE, which limits field names to ten characters,
so two of them get shortened in that format alone: facility_name becomes
FACILITY and instrument_id becomes INSTR_ID. The
other four keep their names in upper case. CSV, JSON and GeoJSON all use the full names
above.
Not yet published
- The facility property boundary.
- The
parametersfor the ground level monitors. Their locations are published; the parameters stay empty until the assignment of analyzers to sites is confirmed.
Current Readings
- Endpoint:
GET /api-data.php - Access: Public, with no login or API key required
- Parameters: None
- Rate limit: 120 requests/hour per IP (HTTP 429 when exceeded)
- Output format: JSON only
This endpoint takes no parameters. Every request returns the same thing: the latest reading for every monitored location and property as of the moment of the request, covering every pollutant at every monitoring location plus every weather property at the met station. Ozone appears here; the Fenceline Monitoring Data leaves it out. There is no way to ask this endpoint for a specific location, property or date range. For those, use the Fenceline Monitoring Data API, or the Download Data page.
GET /api-data.php
{
"generatedAt": "2026-07-28T20:45:00+00:00",
"records": [
{
"site": "path1",
"siteName": "Path 1",
"property": "ben",
"propertyName": "Benzene",
"unit": "ppb",
"timestamp": "2026-07-28T20:45:00+00:00",
"value": 0.246609,
"loq": 0.493218,
"description": "No Detection",
"online": true
},
{
"site": "met",
"siteName": "Met",
"property": "wind_speed",
"propertyName": "Wind Speed",
"unit": "mph",
"timestamp": "2026-07-28T20:45:00+00:00",
"value": 5.9,
"loq": null,
"description": null,
"online": true
}
]
}
Data dictionary
| Field | Type | Description |
|---|---|---|
site | text | Monitoring location key, for example path1 or met. |
siteName | text | Human-readable location name, for example "Path 1". |
property | text | Gas or weather property key, for example ben or wind_speed. |
propertyName | text | Human-readable property name, for example "Benzene". |
unit | text or null | Unit of measurement, for example ppb or mph. null if unitless. |
timestamp | text, ISO 8601 UTC | Time of the latest reading. This differs from the Fenceline data set, which uses Pacific Standard Time in separate date and time fields. |
value | number | The measured value. A non-detect arrives already substituted at half the gas's Limit of Quantification, which is standard practice for a value below a reporting limit; description says when that substitution applied. |
loq | number or null | Limit of Quantification for this gas and location, per reading where the instrument reports one. Always null for weather properties. |
description | text or null | Data status or quality label, and null for a normal valid reading. The Learning Center lists what each label means. |
online | true or false | Whether the source instrument reported data recently enough to count as online. |
This endpoint takes no input, so there is little to get wrong: exceeding the rate limit returns HTTP 429, and any other non-200 response points to a server-side problem and not to the request.
Related resources
The website's Learning Center defines the terms and acronyms used here, explains each data status label, and lists the current Limit of Quantification for every gas and monitoring location.
The Documents page holds the Fence Line Air Monitoring Plan, the Quality Assurance Project Plan and the quarterly monitoring reports.
The Download Data page provides the Fenceline Monitoring Data as CSV or XML over a chosen date range, stopping five minutes short of the present as above, and the Monitoring Locations as CSV, GeoJSON or shapefile.